{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "19095b39-daba-4632-8b23-35b22ab71a8c",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 快速傅里叶变换fft\n",
    "具体要求参考[链接](https://www.wolai.com/zzutai/ne85AbnL15kmZPPJRQ2q4j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4e42cc3e-b29d-463d-aa51-5a1dae08a51b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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b7/9thEREWG43W7vuBUrVhi9evUy6uvrDcPofrE2GTRokLF06dI2p//mN78x+vTp443TMAzjRz/6kTFkyJAuqF3gjBs3zpg3b553uKGhwUhJSTHy8vKCWKvOW7hwoZGWltbqtMrKSsPpdBrr1q3zjvv4448NSUZxcXEX1bDzzj/ONDY2GklJScaSJUu84yorKw2Xy2X86U9/MgzDMPbt22dIMv761796y/z3f/+34XA4jH/+859dVnd/tXZMnT17tnHbbbe1OU93jbWz7NI22bFdMgzapu7cNtmhXTIM2qauapu63RUos+bNm6d+/fpp3LhxWrVqlYxmr7sqLi7WpEmTfMpnZWWpuLi4q6vZKcXFxbr66qu9L4KUzsZRXV2tjz76yFumu8b67LPPKj4+Xtdcc42WLFnicwtIcXGxbr75ZkVFRXnHZWVlaf/+/friiy+CUV2/nT59Wrt37/bZPhEREZo0aVK32D4XcuDAAaWkpOjyyy/Xvffeq9LSUknS7t275fF4fOIeOnSoBg4c2K3jPnz4sNxut09ccXFxSk9P98ZVXFys3r1769prr/WWmTRpkiIiIrRjx44ur3Nnbdq0SQkJCRoyZIjmzp2riooK77RwizVQwr1tCvd2SaJt6s7s1i5JtE1WtU09AlrjELF48WLdcsstiomJ0bvvvqvvfve7qqmp0b//+79Lktxut8/BXZISExNVXV2tr776Sj179gxGtf3WVhxN09orE+qx/vu//7vGjBmjvn37atu2bcrJyVFZWZmef/55SWfjSk1N9Zmneex9+vTp8jr768SJE2poaGh1+3zyySdBqlVgpKenKz8/X0OGDFFZWZlyc3N10003ae/evXK73YqKimrx/ERiYqL3e9sdNdW9te3ZfH9MSEjwmd6jRw/17du328U+depU3XHHHUpNTdWhQ4f0xBNPaNq0aSouLlZkZGRYxRoodmibwrldkmibunPbZMd2SaJtsqptCokE6sc//rF+9rOftVvm448/9nnYrz1PPfWU99/XXHONamtrtWTJEm8jFUyBjrU78Sf27Oxs77hRo0YpKipK//qv/6q8vDy5XC6rq4pOmjZtmvffo0aNUnp6ugYNGqRXXnklpH8cwbx77rnH+++rr75ao0aN0hVXXKFNmzZp4sSJQaxZ4NilbbJzuyTRNtkF7ZI9dFXbFBIJ1A9/+EPdf//97Za5/PLLO7z89PR0Pf3006qvr5fL5VJSUlKLnlXKy8vVq1cvy3eiQMaalJTUolecpriSkpK8/w9WrOfrTOzp6ek6c+aMjhw5oiFDhrQZl3Qu9lDXr18/RUZGthpHd4nBrN69e+uqq67SwYMHNXnyZJ0+fVqVlZU+Z/u6e9xNdS8vL1dycrJ3fHl5uUaPHu0tc/5D2GfOnNHJkye7dezS2X23X79+OnjwoCZOnBgWsdqlbbJzuyTRNp3PLm2THdolibbJqrYpJBKo/v37q3///pYtv6SkRH369PGeHcrIyNDbb7/tU6agoEAZGRmW1aFJIGPNyMjQT37yEx0/ftx7ObKgoEC9evXS8OHDvWWCFev5OhN7SUmJIiIivHFmZGTo//yf/yOPxyOn0ynpbFxDhgzpFrdISFJUVJTGjh2rwsJCb09cjY2NKiws1Pz584NbuQCrqanRoUOH9O1vf1tjx46V0+lUYWGh7rzzTknS/v37VVpaGpTvZaCkpqYqKSlJhYWF3kapurpaO3bs8PZYlpGRocrKSu3evVtjx46VJG3cuFGNjY1KT08PVtUD4rPPPlNFRYW3gQ6HWO3SNtm5XZJom85nl7bJDu2SRNtkWdvkX38XwXf06FHj/fffN3Jzc42LL77YeP/9943333/f+PLLLw3DMIzXX3/d+P3vf298+OGHxoEDB4zf/OY3RkxMjLFgwQLvMj799FMjJibGeOyxx4yPP/7YWL58uREZGWls2LAhWGG16kKxnjlzxhg5cqQxZcoUo6SkxNiwYYPRv39/Iycnx7uM7hJrc9u2bTOWLl1qlJSUGIcOHTJeeuklo3///sasWbO8ZSorK43ExETj29/+trF3715j7dq1RkxMjPHb3/42iDX339q1aw2Xy2Xk5+cb+/btMx5++GGjd+/ePj1YdUc//OEPjU2bNhmHDx82/ud//seYNGmS0a9fP+P48eOGYRjGv/3bvxkDBw40Nm7caOzatcvIyMgwMjIyglzrC/vyyy+9+6Ek4/nnnzfef/994+jRo4ZhGMazzz5r9O7d23jttdeMDz74wLjtttuM1NRU46uvvvIuY+rUqcY111xj7Nixw9i6dasxePBgY+bMmcEKqU3txfrll18ajz76qFFcXGwcPnzYeO+994wxY8YYgwcPNurq6rzL6C6xBoJd2ia7tkuGQdvU3dumcG2XDIO2KRhtU7dLoGbPnm1IavFXVFRkGMbZrghHjx5tXHzxxcZFF11kpKWlGStXrjQaGhp8llNUVGSMHj3aiIqKMi6//HJj9erVXR/MBVwoVsMwjCNHjhjTpk0zevbsafTr18/44Q9/aHg8Hp/ldIdYm9u9e7eRnp5uxMXFGdHR0cawYcOMn/70pz5ffsMwjL/97W/GjTfeaLhcLuOSSy4xnn322SDVuHN+/etfGwMHDjSioqKMcePGGdu3bw92lTrt7rvvNpKTk42oqCjjkksuMe6++27j4MGD3ulfffWV8d3vftfo06ePERMTY9x+++1GWVlZEGtsTlFRUav75OzZsw3DONtd7FNPPWUkJiYaLpfLmDhxorF//36fZVRUVBgzZ840Lr74YqNXr17GnDlzvD8+Q0l7sZ46dcqYMmWK0b9/f8PpdBqDBg0yHnrooRY/rrpLrIFgl7bJru2SYdA2dfe2KVzbJcOgbQpG2+QwjGZ9qAIAAAAA2hS274ECAAAAgEAjgQIAAAAAk0igAAAAAMAkEigAAAAAMIkECgAAAABMIoECAAAAAJNIoAAAAADAJBIoAAAAADCJBAoAAAAATCKBAgAAAACTSKAAAAAAwCQSKAAAAAAw6f8D5n6UaWoqj+0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "\n",
    "def getSin(amp,freq,phase,sampleList):\n",
    "    return amp*np.sin(-2*math.pi*freq*sampleList+phase)\n",
    "\n",
    "# 1. 获得混合波形\n",
    "srate=3000\n",
    "t=np.linspace(0,1,srate)\n",
    "s1=getSin(amp=1.5, freq=30, phase=0,sampleList=t)    \n",
    "s2=getSin(amp=3, freq=5, phase=0,sampleList=t)  \n",
    "s3=getSin(amp=10, freq=100, phase=0,sampleList=t) \n",
    "s4=getSin(amp=20, freq=120, phase=0,sampleList=t)\n",
    "m=s1+s2+s3+s4\n",
    "\n",
    "# 2. 获得绕线的傅里叶系数\n",
    "##########################################################################################\n",
    "# fCoefs=np.zeros(srate,dtype='complex') \n",
    "# # 循环所有可能的频率\n",
    "# for f in range(srate):\n",
    "#     p=m*np.exp(-1j*2*math.pi*f*t) # 让飞轮旋转时间t\n",
    "#     fCoefs[f]=np.sum(p)      # 记录傅里叶系数        \n",
    "##########################################################################################\n",
    "# 获得傅里叶系数\n",
    "# 第一个参数是混合波形，第二个参数是“飞轮”测试频率上限（即采样率）\n",
    "fCoefs = np.fft.fft(m,srate)\n",
    "\n",
    "# 3. 获得振幅列表：每一个绕线的重心到原点的距离\n",
    "amp_list=2*np.abs(fCoefs/srate)\n",
    "a=np.copy(amp_list)\n",
    "\n",
    "#去掉所有低振幅噪音\n",
    "mask=(amp_list>=1.5)\n",
    "a=mask*a\n",
    "\n",
    "#4.把频率轴从0~3000转换成0~1499 和 -1500~-1\n",
    "freqs=np.fft.fftfreq(len(amp_list),1/srate)#第一个参数是频率长度，第二个参数是采样间隔（采样率的倒数）\n",
    "\n",
    "#把 频率轴和数据都变成0hz在中间，向左是负频率，向右是正频率的形式\n",
    "amp_shift=np.fft.fftshift(amp_list)\n",
    "freq_shift=np.fft.fftshift(freqs)\n",
    "\n",
    "#去掉所有高于110hz的正负频率噪音\n",
    "#z=np.copy(a)\n",
    "for f in range(srate):\n",
    "    if  110<f<2890 :\n",
    "        a[f]=0\n",
    "\n",
    "#把 频率轴和数据都变成0hz在中间，向左是负频率，向右是正频率的形式\n",
    "amp_shift1=np.fft.fftshift(a)\n",
    "     \n",
    "# 把振幅列表画出来\n",
    "fig,ax=plt.subplots(1,2,figsize=(10,5))\n",
    "ax[0].grid()\n",
    "ax[0].stem(freq_shift,amp_shift)\n",
    "ax[0].set_xlim([-150,150])\n",
    "ax[1].grid()\n",
    "ax[1].stem(freq_shift,amp_shift1) #注意：由于频率有负值，所以振幅被平分了，需要乘以2才能还原原始振幅\n",
    "ax[1].set_xlim([-150,150])\n",
    "ax[1].set_ylim([0,20])\n",
    "  \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "55fa91b4-c1d1-4347-b1bd-11bdca4a5038",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
